全部学科
Python全栈
python
NodeJS全栈
nodejs
📅 2026-05-15 6 分钟 ✍️ juanwangdev

MySQL GROUP BY 分组

GROUP BY 子句将查询结果按一个或多个列分组,配合聚合函数进行分组统计。

基本语法

SQL
SELECT 列名, 聚合函数(列名)
FROM 表名
GROUP BY 列名;

单列分组

SQL
-- 创建示例表
CREATE TABLE sales (
    id INT PRIMARY KEY,
    product VARCHAR(50),
    category VARCHAR(30),
    amount DECIMAL(10, 2)
);

INSERT INTO sales VALUES
(1, '手机', '电子产品', 3000),
(2, '电脑', '电子产品', 5000),
(3, '耳机', '电子产品', 500),
(4, '衣服', '服装', 200),
(5, '裤子', '服装', 150);

-- 按类别统计销售额
SELECT category, SUM(amount) AS 总销售额
FROM sales
GROUP BY category;

-- 按类别统计数量和平均值
SELECT category,
       COUNT(*) AS 数量,
       AVG(amount) AS 平均金额,
       SUM(amount) AS 总金额
FROM sales
GROUP BY category;

多列分组

SQL
-- 按类别和产品分组
SELECT category, product, SUM(amount) AS 总金额
FROM sales
GROUP BY category, product;

GROUP BY 与 ORDER BY

SQL
-- 按类别分组并按总销售额降序
SELECT category, SUM(amount) AS 总销售额
FROM sales
GROUP BY category
ORDER BY 总销售额 DESC;

GROUP BY 与 WHERE

SQL
-- WHERE 在 GROUP BY 之前过滤
SELECT category, SUM(amount) AS 总销售额
FROM sales
WHERE amount > 100
GROUP BY category;

WITH ROLLUP 汇总

SQL
-- 在分组结果基础上增加汇总行
SELECT category, SUM(amount) AS 总销售额
FROM sales
GROUP BY category WITH ROLLUP;

-- 结果包含每个类别的汇总和总汇总
-- 电子产品 | 8500
-- 服装     | 350
-- NULL     | 8850  (总汇总)

SELECT 中出现的非聚合列必须出现在 GROUP BY 中。

要点总结

  • GROUP BY 按列值分组,每组返回一行
  • SELECT 中非聚合列必须在 GROUP BY 中出现
  • WHERE 在 GROUP BY 之前执行
  • WITH ROLLUP 可增加汇总行
想在手机上练习这篇文章的配套题目?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码
← 上一篇 MySQL 聚合函数
下一篇 → MySQL HAVING 过滤分组
扫码体验小程序
加载中
想在手机上刷题学习?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码